function [ TransformedX COEFF SCORE latent ] = basic_PCA (X, NumFeatures, X_Description)
	sFilename = [ X_Description, '_princomp.mat' ];

	fprintf('PerformPCA: Cache file name: %s\n', sFilename);
	if ~exist(sFilename,'file')
		fprintf('PerformPCA: Cache file not found, calculating and caching\n');
		[ COEFF, SCORE, latent ] = princomp(X);
		save(sFilename, 'COEFF', 'SCORE', 'latent');
	else
		fprintf('PerformPCA: Loading from cache\n');
		load(sFilename, 'COEFF', 'SCORE', 'latent');
	end;
	fprintf('PerformPCA: PCA calculation done\n');
	disp(size(COEFF));
	disp(size(X));

	ShiftedX = bsxfun(@minus, X, mean(X,1));
	TopEigenVectors = COEFF(:, 1:NumFeatures);

	disp(size(TopEigenVectors));
	disp(size(ShiftedX));
	TransformedX = ShiftedX * TopEigenVectors;

end
